package com.hd.service.activiti;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.impl.persistence.entity.TaskEntity;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;

import com.hd.commons.shiro.ShiroUser;
import com.hd.entity.activiti.BaseVO;
import com.hd.entity.activiti.CommentVO;
import com.hd.entity.activiti.ElementDef;
import com.hd.entity.sys.User;
import com.hd.util.result.Page;

public interface ActivitiService {
	/**
	 * 启动流程
	 * @param processDefKey 流程定义key
	 * @return
	 */
	ProcessInstance startProcessInstance(String processDefKey);
	
	/**
	 * 通过流程实例ID查询流程实例运行过的流程节点
	 * @param processInstanceId 流程实例ID
	 * @return
	 */
	List<HistoricActivityInstance> getHistoricActivityInstanceByProcessInstanceId(String processInstanceId);
	
	/**
	 * 完成任务
	 * @param taskId 任务id
	 * @param content 评论内容
	 * @param userid 评论用户
	 * @param variables 设置变量
	 */
	void completeTask(String taskId, String content, String userid, Map<String, Object> variables);
	
	/**
	 * 通过流程实例ID查询所有的评论
	 * @param processInstanceId 流程实例ID
	 * @return
	 */
	List<CommentVO>getCommentsByProcessInstanceId(String processInstanceId);
	
	/**
	 * 通过任务ID查询评论
	 * @param taskId 任务ID
	 * @return
	 */
	List<Comment>getCommentsByTaskId(String taskId);
	/**
     * 查询代办任务
     * @param user
     * @return
     */
    public List<BaseVO> findTodoTask(User user, Page<BaseVO> page) throws Exception;

    /**
     * 显示流程图,带流程跟踪
     * @param processInstanceId
     * @return
     */
    public InputStream getDiagram(String processInstanceId) throws Exception;

    /**
     * 显示图片-通过流程ID，不带流程跟踪(没有乱码问题)
     * @param resourceType
     * @param processInstanceId
     * @return
     */
    public InputStream getDiagramByProInstanceId_noTrace(String resourceType, String processInstanceId) throws Exception;
    /**
     * 显示图片-通过流程ID，不带流程跟踪(没有乱码问题)
     * @param resourceType
     * @param processInstanceId
     * @return
     */
    public InputStream getDiagramByProInstanceId_noTrace2(String resourceType, String processInstanceId) throws Exception;


    /**
     * 显示图片-通过部署ID，不带流程跟踪(没有乱码啊问题)
     * @param resourceType
     * @param processDefinitionId
     * @return
     * @throws Exception
     */
    public InputStream getDiagramByProDefinitionId_noTrace(String resourceType, String processDefinitionId) throws Exception;
    
    /**
	 * 查询下一个节点集合
	 * @param procdefKey 流程定义KEY
	 * @param key
	 * @return
	 */
	List<ElementDef>getNextElementDefs(String procdefKey, String key)throws Exception;
	
	/**
	 * 签收任务
	 * @param user
	 * @param taskId
	 */
	void doClaim(User user, String taskId);

	/**
	 * 反签收：将任务办理人置空，任务又回到未签收状态，日常生活中应用最最多的是误签收这种，只有设置了候选人或候选组才能反签收
	 * @param taskId
	 */
	void doUnClaim(String taskId);
	 /**
     * 委派任务
     */
	void doDelegateTask(String userId, String taskId) throws Exception;
	/**
     * 转办任务
     */
	void doTransferTask(String userId, String taskId) throws Exception;
	 /**
     * 撤销任务
     * @param historyTaskId
     * @throws Exception
     */
    public Integer revoke(String historyTaskId, String processInstanceId, User user) throws Exception;
    /**
	 * 跳转（包括回退和向前）至指定活动节点
	 */
	public void moveTo(String currentTaskId, String targetTaskDefinitionKey) throws Exception;

	/**
	 * 跳转（包括回退和向前）至指定活动节点
	 * 
	 * @param currentTaskEntity
	 *            当前任务节点
	 * @param targetTaskDefinitionKey
	 *            目标任务节点（在模型定义里面的节点名称）
	 * @throws Exception
	 */
	public void moveTo(TaskEntity currentTaskEntity, String targetTaskDefinitionKey) throws Exception;
	/**
     * 读取已结束中的流程-admin查看
     *
     * @return
     */
    public List<BaseVO> findFinishedProcessInstances(Page<BaseVO> page) throws Exception;
    
    /**
     * 各个审批人员查看自己完成的任务
     * @return
     * @throws Exception
     */
    public List<BaseVO> findFinishedTaskInstances(User user, Page<BaseVO> page) throws Exception;
    /**
     * 各个审批人员查看自己完成的任务
     * 电脑版上查看
     * @return
     * @throws Exception
     */
    public List<BaseVO> findFinishedTaskInstancesPC(User user, Page<BaseVO> page) throws Exception;
    
    /**
     * 管理运行中流程
     * @return
     * @throws Exception
     */
    public List<ProcessInstance> listRuningProcess(Page<ProcessInstance> page) throws Exception;

    /**
     * 激活流程实例
     * @param processInstanceId
     * @throws Exception
     */
    public void activateProcessInstance(String processInstanceId) throws Exception;
    
    /**
     * 挂起流程实例
     * @param processInstanceId
     * @throws Exception
     */
    public void suspendProcessInstance(String processInstanceId) throws Exception;
    
    /**
     * 测试 - 动态创建流程信息
     * @throws Exception
     */
    public void addProcessByDynamic() throws Exception;
    /**
     * 查询流程实例流程节点走过的节点记录
     * @param processInstanceId
     * @return
     */
    public Map<String,Object>queryHistoricActivityInstances(String processInstanceId);
    
    /**
     * 查询任务待审批人及任务
     * @param processInstanceId
     * @return
     */
    Map<String,Object> findTodoTaskAssigneeOrCandidateUsers(String processInstanceId);
  /**
   * 查询任务待审批人及任务
   * @param processInstanceId
   * @return
   */
    Map<String,Object>findTodoTaskAssigneeOrCandidateUserIds(String processInstanceId);
    
    /**
     * 加签
     * @param taskId
     * @param assignee
     */
    void addSign(String taskId, String assignee);
    /**
     * 减签
     * @param taskId
     */
    void minSign(String taskId);
    /**
     * 作废流程
     * @param processInstanceId
     * @param clazz
     * @param beanName
     */
    void doInvalidProcess(String processInstanceId, String tableName);
    /**
     * 并行分支跳转
     * @param currentTaskId
     * @param targetTaskDefinitionKey
     */
    void paralleMoveTo(String currentTaskId, String targetTaskDefinitionKey);
    /**
     * 多实例跳转
     * @param currentTaskId
     * @param targetTaskDefinitionKey
     */
    void multiInstanceMoveTo(String currentTaskId, String targetTaskDefinitionKey);
    /**
     * 通过流程Id查询待办任务
     * @param processInstanceId
     * @return
     */
    List<Task>findByProcessInstanceId(String processInstanceId);
}
